﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Csla;
using System.ComponentModel.DataAnnotations;

namespace Sireass.Bl
{
    [Serializable]
    public class ActividadInformeEdit : BusinessBase<ActividadInformeEdit>
    {
        #region Propiedades
        public static readonly PropertyInfo<long> IdActividadInformeProperty = RegisterProperty<long>(c => c.IdActividadInforme);
        [Display(Name = "Id de Actividad Informe")]
        public long IdActividadInforme
        {
            get { return GetProperty(IdActividadInformeProperty); }
         private set { LoadProperty(IdActividadInformeProperty, value); }
        }

        public static readonly PropertyInfo<long> IdInformeProperty = RegisterProperty<long>(c => c.IdInforme);
        [Display(Name = "Id de Informe")]
        public long IdInforme
        {
            get { return GetProperty(IdInformeProperty); }
            set { SetProperty(IdInformeProperty, value); }
        }

        public static readonly PropertyInfo<byte> IdTipoActividadProperty = RegisterProperty<byte>(c => c.IdTipoActividad);
        [Display(Name = "Id Tipo de Actividad")]
        public byte IdTipoActividad
        {
            get { return GetProperty(IdTipoActividadProperty); }
            set { SetProperty(IdTipoActividadProperty, value); }
        }

        public static readonly PropertyInfo<string> DescripcionProperty = RegisterProperty<string>(c => c.Descripcion);
        [Display(Name = "Descripción")]
        public string Descripcion
        {
            get { return GetProperty(DescripcionProperty); }
            set { SetProperty(DescripcionProperty, value); }
        }

        public static readonly PropertyInfo<bool> HabilitadoProperty = RegisterProperty<bool>(c => c.Habilitado);
        [Display(Name = "Habilitado")]
        public bool Habilitado
        {
            get { return GetProperty(HabilitadoProperty); }
            set { SetProperty(HabilitadoProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaAltaProperty = RegisterProperty<DateTime>(c => c.FechaAlta);
        [Display(Name = "Fecha Alta")]
        public DateTime FechaAlta
        {
            get { return GetProperty(FechaAltaProperty); }
            set { SetProperty(FechaAltaProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaBajaProperty = RegisterProperty<DateTime>(c => c.FechaBaja);
        [Display(Name = "Fecha Baja")]
        public DateTime FechaBaja
        {
            get { return GetProperty(FechaBajaProperty); }
            set { SetProperty(FechaBajaProperty, value); }
        }
        #endregion

        #region Factory
        public static void NewActividadInformeEdit(EventHandler<DataPortalResult<ActividadInformeEdit>> callback)
        {
            DataPortal.BeginCreate<ActividadInformeEdit>(callback);
        }

        public static ActividadInformeEdit NewActividadInformeEdit()
        {
            return DataPortal.Create<ActividadInformeEdit>();
        }

        public static void GetActividadInformeEdit(long id, EventHandler<DataPortalResult<ActividadInformeEdit>> callback)
        {
            DataPortal.BeginFetch<ActividadInformeEdit>(id, callback);
        }

        public static ActividadInformeEdit GetActividadInformeEdit(long id)
        {
            return DataPortal.Fetch<ActividadInformeEdit>(id);
        }

        #endregion

        #region Métodos
        public static void AddObjectAuthorizationRules()
        {
            Type type = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType;
            PerfilServicioCriteria criteria = new PerfilServicioCriteria(type.FullName, true);
            PerfilServicioList perfilesPorServicio = PerfilServicioList.GetPerfilServicioList(criteria);
            List<string> roles = new List<string>(perfilesPorServicio.Count);
            foreach (PerfilServicioInfo perfilServicio in perfilesPorServicio)
            {
                roles.Add(perfilServicio.Perfil);
            }
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.CreateObject, roles));
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.GetObject, roles));
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.EditObject, roles));
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.DeleteObject, roles));
        }

        #endregion

        #region Data Portal
        private void DataPortal_Fetch(long id)
        {
            using (var dalManager = Sireass.Dal.DalFactory.GetManager())
            {
                var dal = dalManager.GetProvider<Sireass.Dal.IActividadInformeDal>();
                using (var data = new Csla.Data.SafeDataReader(dal.Fetch(id)))
                {
                    data.Read();
                    using (BypassPropertyChecks)
                    {
                        IdActividadInforme = data.GetInt64("nId_Actividad_Informe");
                        IdInforme = data.GetInt64("nId_Informe");
                        IdTipoActividad = data.GetByte("nId_TipoActividad");
                        Descripcion = data.GetString("cDescripcion");
                        Habilitado = data.GetBoolean("bHabilitado");
                        FechaAlta = data.GetDateTime("dFecha_Alta");
                        FechaBaja = data.GetDateTime("dFecha_Baja");
                    }
                }
            }
            BusinessRules.CheckRules();
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Insert()
        {
            using (var dalManager = Sireass.Dal.DalFactory.GetManager())
            {
                var dal = dalManager.GetProvider<Sireass.Dal.IActividadInformeDal>();
                using (BypassPropertyChecks)
                {
                    IdActividadInforme = dal.Insert(IdInforme, IdTipoActividad, Descripcion, Habilitado);

                }
            }
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Update()
        {
            using (var dalManager = Sireass.Dal.DalFactory.GetManager())
            {
                var dal = dalManager.GetProvider<Sireass.Dal.IActividadInformeDal>();
                using (BypassPropertyChecks)
                {
                    dal.Update(IdActividadInforme, IdInforme, IdTipoActividad, Descripcion, Habilitado);
                }
            }
        }

        protected override void DataPortal_OnDataPortalInvoke(DataPortalEventArgs e)
        {
            // implement your behavior here
            base.DataPortal_OnDataPortalInvoke(e);
        }

        protected override void DataPortal_OnDataPortalInvokeComplete(DataPortalEventArgs e)
        {
            // implement your behavior here
            base.DataPortal_OnDataPortalInvokeComplete(e);
        }

        protected override void Child_OnDataPortalException(DataPortalEventArgs e, Exception ex)
        {
            // implement your behavior here
            base.Child_OnDataPortalException(e, ex);
        }
        #endregion
    }
}
